﻿#pragma once

#include <SFML/Graphics.hpp>
#include "../../concrete/graphic/AccusationView.h"
#include "../../../domain/models/CardSet.h"
#include "../../../domain/models/Player.h"
#include "../../../domain/network/GameServer.h"
#include "../../../domain/network/PlayerClient.h"

namespace Views {
	/**
	* Widoki skojarzone z graczem-właścicielem serwera
	*/
	namespace Server {
		class AccusationView: public Graphic::AccusationView
		{
			Domain::Network::GameServer* server; /**< Serwer gry */
			Players::Player* server_owner; /**< Gracz będący założycielem serwera */
			Players::Player* current_player; /**< Gracz, którego jest teraz tura */
			Cards::CardsCollection all_cards; /**< Wszystkie karty w grze */

		public:
			/**
			* @param server Serwer gry
			* @param form Główna formatka aplikacji
			* @param server_owner Gracz będący założycielem serwera
			* @param current_player Gracz, którego jest teraz tura
			*/
			AccusationView(Domain::Network::GameServer* server, Utils::GUI::Form* form,
				Players::Player* server_owner, Players::Player*);
			
			/**
			* Jeśli aktualny gracz jest właścicielem serwera, otwiera okno dialogowe
			* z pytaniem, czy gracz chce dokonać oskarżenia.
			* W przeciwnym razie czeka na decyzję klienta którego teraz jest tura
			*/
			void askIfPlayerWantsToPerformAccusation();
			/**
			* Jeśli aktualny gracz jest właścicielem serwera, otwiera okno dialogowe
			* z pytaniem o karty, jakie gracz chce wybrać w oskarżeniu.
			* W przeciwnym razie czeka na decyzję klienta którego teraz jest tura.
			*/
			void askForCardsInAccusation(Cards::CardsCollection);

		protected:
			/**
			* Wysyła do klientów informację o decyzji właściciela serwera i wywołuje metodę z klasy nadrzędnej
			* @param decision Decyzja, czy podejmować oskarżenie
			*/
			virtual void onDecisionSet(bool);
			/**
			* Funkcja odbierająca od klienta dane o jego decyzji w sprawie wysunięcia oskarżenia
			* Przesyła te dane dalej, do pozostałych klientów i wywołuje playerDecisionSetEvent
			* @param player_client Klient gracza wysyłającego pakiet
			* @param packet Pakiet zawierający dane o decyzji
			*/
			virtual void onDecisionSet(Domain::Network::PlayerClient*, sf::Packet);
			/**
			* Wysyła do klientów informację o kartach wybranych przez właściciela serwera
			* i wywołuje metodę z klasy nadrzędnej
			* @param cards Karty w oskarżeniu
			*/
			virtual void onCardsSet(Cards::CardSet);
			/**
			* Funkcja odbierająca od klienta dane o wybranych przez niego kartach w oskarżeniu.
			* Przesyła te dane dalej, do pozostałych klientów i wywołuje cardsInAccusationSetEvent
			* @param player_client Klient gracza wysyłającego pakiet
			* @param packet Pakiet zawierający dane o kartach
			*/
			virtual void onCardsSet(Domain::Network::PlayerClient*, sf::Packet);
		};
	}
}

